using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Engine.Components;
using Engine.Objects;
namespace Engine
{
    /// <summary>
    /// Это главный тип игры
    /// </summary>
    public class NOWAEngine : Microsoft.Xna.Framework.Game
    {
        public GraphicsDeviceManager graphics;        
        ComponentManager managerComponent;
        private IntPtr form;
        private IntPtr panel;
        private System.Windows.Forms.Form xnaForm;
        public ComponentManager Manager { get { return managerComponent; } }
        public InputManager BaseInputManager 
        {
            get
	        {
                if (managerComponent.Init)
                {
                    return managerComponent.GetComponent("InputManager");
                }
                return null;
	        }
        }
        public GameManager BaseGameManager
        {
            get
            {
                if (managerComponent.Init)
                {
                    return managerComponent.GetComponent("GameManager");
                }
                return null;
            }
        }
        public SceneManager BaseSceneManager
        {
            get
            {
                if (managerComponent.Init)
                {
                    return managerComponent.GetComponent("SceneManager");
                }
                return null;
            }
        }
    
       
        public NOWAEngine()
        {
            GraphicsAdapter adp = GraphicsAdapter.DefaultAdapter;
            if (!adp.IsProfileSupported(GraphicsProfile.HiDef))
            {
              fbDeprofiler.DeProfiler.Run();
            }
            
            graphics = new GraphicsDeviceManager(this);
           
           // Content.RootDirectory = "Content";
           // Основной менеджер компонентов
            managerComponent = new ComponentManager(this);
            // инициализуем менеджер
            xnaForm = (System.Windows.Forms.Form)System.Windows.Forms.Control.FromHandle(Window.Handle);
            managerComponent.init();
        }


        public NOWAEngine(IntPtr form, IntPtr panel)
        {
            // TODO: Complete member initialization
            this.form = form;
            this.panel = panel;
            PresentationParameters param = new PresentationParameters();
           
            graphics = new GraphicsDeviceManager(this);
            graphics.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings);
            xnaForm = (System.Windows.Forms.Form)System.Windows.Forms.Control.FromHandle(Window.Handle);
            xnaForm.GotFocus += new EventHandler(xnaForm_GotFocus);
            (System.Windows.Forms.Form.FromHandle(panel)).Resize += new EventHandler(Panel_Resize);
            (System.Windows.Forms.Form.FromHandle(form)).Resize += new EventHandler(Panel_Resize);
            // Content.RootDirectory = "Content";
            // Основной менеджер компонентов
            managerComponent = new ComponentManager(this);
            // инициализуем менеджер
            managerComponent.init();
        }
void Panel_Resize(object sender, EventArgs e)
{
    System.Windows.Forms.Control Panel = System.Windows.Forms.Control.FromHandle(panel);
   graphics.PreferredBackBufferWidth = Panel.Width;
   graphics.PreferredBackBufferHeight = Panel.Height;
  float aspectRatio = (float)Panel.Width / Panel.Height;
   graphics.ApplyChanges();
}
        void xnaForm_GotFocus(object sender, EventArgs e)
        {
            ((System.Windows.Forms.Form)sender).Visible = false;
            ((System.Windows.Forms.Form)System.Windows.Forms.Form.FromHandle(form)).TopMost = false;
        }

        void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
        {
            e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = panel;
        }

        /// <summary>
        /// Позволяет игре выполнить инициализацию, необходимую перед запуском.
        /// Здесь можно запросить нужные службы и загрузить неграфический
        /// контент.  Вызов base.Initialize приведет к перебору всех компонентов и
        /// их инициализации.
        /// </summary>
        protected override void Initialize()
        {
            // ЗАДАЧА: добавьте здесь логику инициализации

          
            base.Initialize();
        }

        /// <summary>
        /// LoadContent будет вызываться в игре один раз; здесь загружается
        /// весь контент.
        /// </summary>
        protected override void LoadContent()
        {
            // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
           // spriteBatch = new SpriteBatch(GraphicsDevice);
       
            // ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
        }

        /// <summary>
        /// UnloadContent будет вызываться в игре один раз; здесь выгружается
        /// весь контент.
        /// </summary>
        protected override void UnloadContent()
        {
            managerComponent = null;
            // ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
        }
        protected override void OnExiting(object sender, EventArgs args)
        {
            managerComponent.Close();
            managerComponent = null;
            base.OnExiting(sender, args);
        }
        /// <summary>
        /// Позволяет игре запускать логику обновления мира,
        /// проверки столкновений, получения ввода и воспроизведения звуков.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        protected override void Update(GameTime gameTime)
        {
            // Позволяет выйти из игры
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // ЗАДАЧА: добавьте здесь логику обновления

            base.Update(gameTime);
        }
       
        /// <summary>
        /// Вызывается, когда игра отрисовывается.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        protected override void Draw(GameTime gameTime)
        {


           
                base.Draw(gameTime);
            

        }
    }
}
